package letcode.oneQuestionPerDay._202003._20200307;

import java.util.*;

/*
队列最大值
 */
public class MaxQueue {
   Queue<Integer> que;
   Deque<Integer> deq;

    public static void main(String[] args) {
        MaxQueue maxQueue=new MaxQueue();
        maxQueue.push_back(1);
        maxQueue.push_back(2);
        System.out.println(maxQueue.max_value());
        System.out.println(maxQueue.pop_front());
        System.out.println(maxQueue.max_value());
/*        System.out.println(maxQueue.pop_front());
        System.out.println(maxQueue.max_value());*/
    }
    public MaxQueue() {
        que=new LinkedList<>();  //队列：插入和删除
        deq=new LinkedList<>();  //双端队列：获取最大值
    }

    public int max_value() {
       return deq.size()>0?deq.peek():-1;  //双端队列的对手为que的最大值
    }
    //入队
    public void push_back(int value) {
        que.offer(value);  //value入队
        while (deq.size()>0&&deq.peekLast()<value){
            deq.pollLast(); //将deq队尾小value的元素删掉
        }
        deq.offerLast(value); //将value放在deq队尾
    }
    //出队
    public int pop_front() {
        int temp=que.size()>0?que.poll():-1;//获得队首元素
        if (deq.size()>0&&temp==deq.peek()){
            deq.poll();//如果出队的元素是当前最大值，将deq的队首出队
        }
        return temp;
    }
    /**
     * Your MaxQueue object will be instantiated and called as such:将实例化并调用MaxQueue对象：
     * MaxQueue obj = new MaxQueue();
     * int param_1 = obj.max_value();
     * obj.push_back(value);
     * int param_3 = obj.pop_front();
     */
}
/*
请定义一个队列并实现函数 max_value 得到队列里的最大值，要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空，pop_front 和 max_value 需要返回 -1

示例 1：

输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
示例 2：

输入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
 

限制：

1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */